//+------------------------------------------------------------------+
//|                                                       winreg.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <WinAPI/windef.h>
#include <WinAPI/winnt.h>

// 注册表值项结构 (Unicode 版本)
struct VALENTW
{
   PVOID             ve_valuename;  // 值项名称指针
   uint              ve_valuelen;   // 值项名称长度
   uchar             offset1[4];    // 填充字节1 (对齐用)
   PVOID             ve_valueptr;   // 值项数据指针
   uint              ve_type;       // 值项数据类型
   uchar             offset2[4];    // 填充字节2 (对齐用)
};

//+------------------------------------------------------------------+
//|                         注册表操作函数声明                       |
//+------------------------------------------------------------------+
#import "advapi32.dll"
/// 中止指定计算机的系统关闭操作
/// @param machine_name 目标计算机名称
/// @return 操作结果
int     AbortSystemShutdownW(string machine_name);

/// 检查系统是否从休眠状态启动
/// @param hiberboot 返回休眠启动状态
/// @param clear_flag 清除标志
/// @return 操作结果
uint    CheckForHiberboot(uchar &hiberboot, uchar clear_flag);

/// 发起系统关机操作
/// @param machine_name 目标计算机名称
/// @param message 显示消息
/// @param grace_period 宽限期
/// @param shutdown_flags 关机标志
/// @param reason 关机原因
/// @return 操作结果
uint    InitiateShutdownW(string machine_name, string message, uint grace_period, uint shutdown_flags, uint reason);

/// 发起系统关机操作 (扩展版本)
/// @param machine_name 目标计算机名称
/// @param message 显示消息
/// @param timeout 超时时间
/// @param force_apps_closed 强制关闭应用标志
/// @param reboot_after_shutdown 关机后重启标志
/// @param reason 关机原因
/// @return 操作结果
int     InitiateSystemShutdownExW(string machine_name, string message, uint timeout, int force_apps_closed, int reboot_after_shutdown, uint reason);

/// 发起系统关机操作
/// @param machine_name 目标计算机名称
/// @param message 显示消息
/// @param timeout 超时时间
/// @param force_apps_closed 强制关闭应用标志
/// @param reboot_after_shutdown 关机后重启标志
/// @return 操作结果
int     InitiateSystemShutdownW(string machine_name, string message, uint timeout, int force_apps_closed, int reboot_after_shutdown);

/// 关闭注册表项句柄
/// @param key 注册表项句柄
/// @return 操作结果
int     RegCloseKey(HANDLE key);

/// 连接到远程注册表 (扩展版本)
/// @param machine_name 目标计算机名称
/// @param key 预定义注册表项句柄
/// @param Flags 连接标志
/// @param result 返回的连接句柄
/// @return 操作结果
int     RegConnectRegistryExW(const string machine_name, HANDLE key, uint Flags, HANDLE &result);

/// 连接到远程注册表
/// @param machine_name 目标计算机名称
/// @param key 预定义注册表项句柄
/// @param result 返回的连接句柄
/// @return 操作结果
int     RegConnectRegistryW(const string machine_name, HANDLE key, HANDLE &result);

/// 复制注册表树
/// @param key_src 源注册表项句柄
/// @param sub_key 子项名称
/// @param key_dest 目标注册表项句柄
/// @return 操作结果
int     RegCopyTreeW(HANDLE key_src, const string sub_key, HANDLE key_dest);

/// 创建注册表项 (扩展版本)
/// @param key 父项句柄
/// @param sub_key 子项名称
/// @param reserved 保留参数
/// @param class_name 类名
/// @param options 创建选项
/// @param desired 访问权限
/// @param security_attributes 安全属性
/// @param result 返回的注册表项句柄
/// @param disposition 返回的创建类型
/// @return 操作结果
int     RegCreateKeyExW(HANDLE key, const string sub_key, PVOID reserved, string class_name, uint options, uint desired, PVOID security_attributes, HANDLE &result, uint &disposition);

/// 在事务中创建注册表项
/// @param key 父项句柄
/// @param sub_key 子项名称
/// @param reserved 保留参数
/// @param class_name 类名
/// @param options 创建选项
/// @param desired 访问权限
/// @param security_attributes 安全属性
/// @param result 返回的注册表项句柄
/// @param disposition 返回的创建类型
/// @param transaction 事务句柄
/// @param extended_parameter 扩展参数
/// @return 操作结果
int     RegCreateKeyTransactedW(HANDLE key, const string sub_key, PVOID reserved, string class_name, uint options, uint desired, PVOID security_attributes, HANDLE &result, uint &disposition, HANDLE transaction, PVOID extended_parameter);

/// 创建注册表项
/// @param key 父项句柄
/// @param sub_key 子项名称
/// @param result 返回的注册表项句柄
/// @return 操作结果
int     RegCreateKeyW(HANDLE key, const string sub_key, HANDLE &result);

/// 删除注册表项 (扩展版本)
/// @param key 父项句柄
/// @param sub_key 子项名称
/// @param desired 访问权限
/// @param reserved 保留参数
/// @return 操作结果
int     RegDeleteKeyExW(HANDLE key, const string sub_key, uint desired, PVOID reserved);

/// 在事务中删除注册表项
/// @param key 父项句柄
/// @param sub_key 子项名称
/// @param desired 访问权限
/// @param reserved 保留参数
/// @param transaction 事务句柄
/// @param extended_parameter 扩展参数
/// @return 操作结果
int     RegDeleteKeyTransactedW(HANDLE key, const string sub_key, uint desired, PVOID reserved, HANDLE transaction, PVOID extended_parameter);

/// 删除注册表键值
/// @param key 注册表项句柄
/// @param sub_key 子项名称
/// @param value_name 值项名称
/// @return 操作结果
int     RegDeleteKeyValueW(HANDLE key, const string sub_key, const string value_name);

/// 删除注册表项
/// @param key 父项句柄
/// @param sub_key 子项名称
/// @return 操作结果
int     RegDeleteKeyW(HANDLE key, const string sub_key);

/// 删除注册表树
/// @param key 父项句柄
/// @param sub_key 子项名称
/// @return 操作结果
int     RegDeleteTreeW(HANDLE key, const string sub_key);

/// 删除注册表值项
/// @param key 注册表项句柄
/// @param value_name 值项名称
/// @return 操作结果
int     RegDeleteValueW(HANDLE key, const string value_name);

/// 禁用预定义注册表项缓存
/// @return 操作结果
int     RegDisablePredefinedCache(void);

/// 禁用预定义注册表项缓存 (扩展版本)
/// @return 操作结果
int     RegDisablePredefinedCacheEx(void);

/// 禁用注册表反射
/// @param base 注册表项句柄
/// @return 操作结果
int     RegDisableReflectionKey(HANDLE base);

/// 启用注册表反射
/// @param base 注册表项句柄
/// @return 操作结果
int     RegEnableReflectionKey(HANDLE base);

/// 枚举注册表子项 (扩展版本)
/// @param key 注册表项句柄
/// @param index 子项索引
/// @param name 返回的子项名称
/// @param name_size 名称缓冲区大小
/// @param reserved 保留参数
/// @param class_name 返回的类名
/// @param class_size 类名缓冲区大小
/// @param last_write_time 最后写入时间
/// @return 操作结果
int     RegEnumKeyExW(HANDLE key, uint index, ushort &name[], uint &name_size, PVOID reserved, ushort &class_name[], uint &class_size, FILETIME &last_write_time);

/// 枚举注册表子项
/// @param key 注册表项句柄
/// @param index 子项索引
/// @param name 返回的子项名称
/// @param name_size 名称缓冲区大小
/// @return 操作结果
int     RegEnumKeyW(HANDLE key, uint index, ushort &name[], uint &name_size);

/// 枚举注册表值项
/// @param key 注册表项句柄
/// @param index 值项索引
/// @param value_name 返回的值项名称
/// @param value_name_size 名称缓冲区大小
/// @param reserved 保留参数
/// @param type 返回的值项类型
/// @param data 返回的值项数据
/// @param data_size 数据缓冲区大小
/// @return 操作结果
int     RegEnumValueW(HANDLE key, uint index, ushort &value_name[], uint &value_name_size, PVOID reserved, uint &type, uchar &data[], uint &data_size);

/// 刷新注册表项到磁盘
/// @param key 注册表项句柄
/// @return 操作结果
int     RegFlushKey(HANDLE key);

/// 获取注册表项安全描述符
/// @param key 注册表项句柄
/// @param SecurityInformation 安全信息
/// @param security_descriptor 安全描述符
/// @param security_descriptor_size 安全描述符大小
/// @return 操作结果
int     RegGetKeySecurity(HANDLE key, uint SecurityInformation, SECURITY_DESCRIPTOR &security_descriptor, uint &security_descriptor_size);

/// 获取注册表值项数据
/// @param key 注册表项句柄
/// @param sub_key 子项名称
/// @param value 值项名称
/// @param flags 标志位
/// @param type 返回的值项类型
/// @param data 返回的值项数据
/// @param data_size 数据缓冲区大小
/// @return 操作结果
int     RegGetValueW(HANDLE key, const string sub_key, const string value, uint flags, uint &type, uchar &data[], uint &data_size);

/// 加载应用程序注册表项
/// @param file 注册表文件路径
/// @param result 返回的注册表项句柄
/// @param desired 访问权限
/// @param options 加载选项
/// @param reserved 保留参数
/// @return 操作结果
int     RegLoadAppKeyW(const string file, HANDLE &result, uint desired, uint options, PVOID reserved);

/// 加载注册表配置单元
/// @param key 父项句柄
/// @param sub_key 子项名称
/// @param file 注册表文件路径
/// @return 操作结果
int     RegLoadKeyW(HANDLE key, const string sub_key, const string file);

/// 加载多语言用户界面字符串
/// @param key 注册表项句柄
/// @param value 值项名称
/// @param out_buf 输出缓冲区
/// @param out_buf_size 输出缓冲区大小
/// @param data 返回的数据长度
/// @param flags 标志位
/// @param directory 目录路径
/// @return 操作结果
int     RegLoadMUIStringW(HANDLE key, const string value, ushort &out_buf[], uint &out_buf_size, uint &data, uint flags, const string directory);

/// 注册表变更通知
/// @param key 注册表项句柄
/// @param watch_subtree 监视子树标志
/// @param notify_filter 通知过滤器
/// @param event 事件句柄
/// @param asynchronous 异步操作标志
/// @return 操作结果
int     RegNotifyChangeKeyValue(HANDLE key, int watch_subtree, uint notify_filter, HANDLE event, int asynchronous);

/// 打开当前用户注册表项
/// @param desired 访问权限
/// @param result 返回的注册表项句柄
/// @return 操作结果
int     RegOpenCurrentUser(uint desired, HANDLE &result);

/// 打开注册表项 (扩展版本)
/// @param key 父项句柄
/// @param sub_key 子项名称
/// @param options 打开选项
/// @param desired 访问权限
/// @param result 返回的注册表项句柄
/// @return 操作结果
int     RegOpenKeyExW(HANDLE key, const string sub_key, uint options, uint desired, HANDLE &result);

/// 在事务中打开注册表项
/// @param key 父项句柄
/// @param sub_key 子项名称
/// @param options 打开选项
/// @param desired 访问权限
/// @param result 返回的注册表项句柄
/// @param transaction 事务句柄
/// @param extended_paremeter 扩展参数
/// @return 操作结果
int     RegOpenKeyTransactedW(HANDLE key, const string sub_key, uint options, uint desired, HANDLE &result, HANDLE transaction, PVOID extended_paremeter);

/// 打开注册表项
/// @param key 父项句柄
/// @param sub_key 子项名称
/// @param result 返回的注册表项句柄
/// @return 操作结果
int     RegOpenKeyW(HANDLE key, const string sub_key, HANDLE &result);

/// 打开用户类注册表根项
/// @param token 用户令牌
/// @param options 打开选项
/// @param desired 访问权限
/// @param result 返回的注册表项句柄
/// @return 操作结果
int     RegOpenUserClassesRoot(HANDLE token, uint options, uint desired, HANDLE &result);

/// 覆盖预定义注册表项
/// @param key 预定义注册表项句柄
/// @param new_key 新注册表项句柄
/// @return 操作结果
int     RegOverridePredefKey(HANDLE key, HANDLE new_key);

/// 查询注册表项信息
/// @param key 注册表项句柄
/// @param class_name 返回的类名
/// @param class_size 类名缓冲区大小
/// @param reserved 保留参数
/// @param sub_keys 返回的子项数量
/// @param max_sub_key_len 最大子项名称长度
/// @param max_class_len 最大类名长度
/// @param values 返回值项数量
/// @param max_value_name_len 最大值项名称长度
/// @param max_value_len 最大值项数据长度
/// @param security_descriptor 安全描述符
/// @param last_write_time 最后写入时间
/// @return 操作结果
int     RegQueryInfoKeyW(HANDLE key, string class_name, uint &class_size, PVOID reserved, uint &sub_keys, uint &max_sub_key_len, uint &max_class_len, uint &values, uint &max_value_name_len, uint &max_value_len, uint &security_descriptor, FILETIME &last_write_time);

/// 查询多个注册表值项
/// @param key 注册表项句柄
/// @param val_list 值项列表
/// @param num_vals 值项数量
/// @param value_buf 值项数据缓冲区
/// @param totsize 总大小
/// @return 操作结果
int     RegQueryMultipleValuesW(HANDLE key, VALENTW &val_list[], uint num_vals, ushort &value_buf[], uint &totsize);

/// 查询注册表反射状态
/// @param base 注册表项句柄
/// @param is_reflection_disabled 返回反射禁用状态
/// @return 操作结果
int     RegQueryReflectionKey(HANDLE base, int &is_reflection_disabled);

/// 查询注册表值项数据 (扩展版本)
/// @param key 注册表项句柄
/// @param value_name 值项名称
/// @param reserved 保留参数
/// @param type 返回的值项类型
/// @param data 返回的值项数据
/// @param data_size 数据缓冲区大小
/// @return 操作结果
int     RegQueryValueExW(HANDLE key, const string value_name, PVOID reserved, uint &type, uchar &data[], uint &data_size);

/// 查询注册表值项数据
/// @param key 注册表项句柄
/// @param sub_key 子项名称
/// @param data 返回的值项数据
/// @param data_size 数据缓冲区大小
/// @return 操作结果
int     RegQueryValueW(HANDLE key, const string sub_key, uchar &data[], uint &data_size);

/// 重命名注册表项
/// @param key 注册表项句柄
/// @param sub_key_name 原子项名称
/// @param new_key_name 新名称
/// @return 操作结果
int     RegRenameKey(HANDLE key, const string sub_key_name, const string new_key_name);

/// 替换注册表项
/// @param key 注册表项句柄
/// @param sub_key 子项名称
/// @param new_file 新注册表文件
/// @param old_file 旧注册表文件
/// @return 操作结果
int     RegReplaceKeyW(HANDLE key, const string sub_key, const string new_file, const string old_file);

/// 恢复注册表项
/// @param key 注册表项句柄
/// @param file 注册表文件路径
/// @param flags 恢复标志
/// @return 操作结果
int     RegRestoreKeyW(HANDLE key, const string file, uint flags);

/// 保存注册表项到文件 (扩展版本)
/// @param key 注册表项句柄
/// @param file 文件路径
/// @param security_attributes 安全属性
/// @param flags 保存标志
/// @return 操作结果
int     RegSaveKeyExW(HANDLE key, const string file, PVOID security_attributes, uint flags);

/// 保存注册表项到文件
/// @param key 注册表项句柄
/// @param file 文件路径
/// @param security_attributes 安全属性
/// @return 操作结果
int     RegSaveKeyW(HANDLE key, const string file, PVOID security_attributes);

/// 设置注册表项安全描述符
/// @param key 注册表项句柄
/// @param SecurityInformation 安全信息
/// @param security_descriptor 安全描述符
/// @return 操作结果
int     RegSetKeySecurity(HANDLE key, uint SecurityInformation, SECURITY_DESCRIPTOR &security_descriptor);

/// 设置注册表键值
/// @param key 注册表项句柄
/// @param sub_key 子项名称
/// @param value_name 值项名称
/// @param type 值项类型
/// @param data 值项数据
/// @param data_size 数据大小
/// @return 操作结果
int     RegSetKeyValueW(HANDLE key, const string sub_key, const string value_name, uint type, const uchar &data[], uint data_size);

/// 设置注册表值项数据 (扩展版本)
/// @param key 注册表项句柄
/// @param value_name 值项名称
/// @param reserved 保留参数
/// @param type 值项类型
/// @param data 值项数据
/// @param data_size 数据大小
/// @return 操作结果
int     RegSetValueExW(HANDLE key, const string value_name, PVOID reserved, uint type, const uchar &data[], uint data_size);

/// 设置注册表值项数据
/// @param key 注册表项句柄
/// @param sub_key 子项名称
/// @param type 值项类型
/// @param data 值项数据
/// @param data_size 数据大小
/// @return 操作结果
int     RegSetValueW(HANDLE key, const string sub_key, uint type, const ushort &data[], uint data_size);

/// 卸载注册表配置单元
/// @param key 注册表项句柄
/// @param sub_key 子项名称
/// @return 操作结果
int     RegUnLoadKeyW(HANDLE key, const string sub_key);
#import
//+------------------------------------------------------------------+